package com.learn.algorithm_1;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;


/**
 * 给定数组，求最大n个和最小n个之和
 */
public class TopnMaxMinSum {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            StringBuilder builder = new StringBuilder();

            String mStr = scanner.nextLine();
            int m = Integer.parseInt(mStr.trim().equals("") ? "0" : mStr.trim());

            builder.append(scanner.nextLine());

            String nStr = scanner.nextLine();
            int n = Integer.parseInt(nStr.trim().equals("") ? "0" : nStr.trim());

            // 去重 + 排序
            List<Integer> list = Arrays.stream(builder.toString().split(" ")).map(i -> {
                try {
                    return Integer.valueOf(i);
                } catch (Exception e) {
                    return 0;
                }
            }).distinct().sorted(Collections.reverseOrder()).collect(Collectors.toList());

            System.out.println(new TopnMaxMinSum().sum(m, list, n));
        }
    }

    /**
     * 计算最大n个和最小n个之和
     *
     * @param m 数组大小
     * @param list 处理后集合
     * @param n 计算个数
     * @return
     */
    public long sum(int m, List<Integer> list, int n) {
        /**
         * 输入：
         * 5
         * 95 88 83 64 100
         * 2
         * 输出：
         * 342
         */
        // 最大n个和最小n个有重叠，返回-1
        if (n*2 > list.size()) {
            return -1;
        }

        Integer sum1 = list.stream().limit(n).mapToInt(Integer::intValue).sum();
        Collections.reverse(list);
        Integer sum2 = list.stream().limit(n).mapToInt(Integer::intValue).sum();

        return sum1 + sum2;
    }

}
